#include "EItemVisitor.h"
#include "DefineCommon.h"
#include "EItem.h"
#include "EItemMetaProperty.h"
#include <cstddef>
#include <iterator>

EItemVisitor::EItemVisitor()
{
}

EItemVisitor::~EItemVisitor()
{
}
    
void EItemVisitor::travelEItem(EItemPtr item, int depth)
{
    if(item == nullptr)
    {
        ELOG_ERROR("item is nullptr");
        return;
    }

    EItemPtr parentItem = nullptr;
    if(m_stackItem.size() != 0)
    {
        // parentItem = m_stackItem.top();
        parentItem = *(m_stackItem.rbegin());
    }

    if(handleEItem(item, depth, parentItem))
    {
        for(size_t i = 0 ; i < item->getChildCount(); i++)
        {
            EItemPtr itemChild = item->getChild(i);
            depth++;
            // m_stackItem.push(item);
            m_stackItem.push_back(item);

            travelEItem(itemChild, depth);

            // m_stackItem.pop();
            m_stackItem.pop_back();
            depth--;
        }
    }

}

bool EItemVisitor::handleEItem(EItemPtr item, int depth, EItemPtr parentItem)
{
    EString strPre;
    for(int i = 0 ; i < depth; i++)
    {
        strPre.append("-");
    }

    if(parentItem != nullptr)
    {
        ELOG_DEBUG("%sName=%s,Depth=%d,ParentName=%s",strPre.data(), item->getName().data(), depth, parentItem->getName().data());
    }
    else 
    {
        ELOG_DEBUG("%sName=%s,Depth=%d",strPre.data(), item->getName().data(), depth);
    }

    return true;
}

void EItemVisitor::setName(const EString& name)
{
    this->m_name = name;
}

EString EItemVisitor::getName()
{
    return this->m_name;
}
